﻿
using System;

/*Une interface est un contrat. Contient: Méthode, propriétés, event. Mais pas: champ ou attribut
 * Des méthodes ne doivent pas implémenter dans l'interface
 * Interface est héritable. Une classe peut hériter de multi Interfaces
 * Construire un objet à partir d'une interface: Définir une classe (non abstract) implémtant toutes les méthodes de l'interfaces.
 * */

interface IVehicule
{
    void Demarrer();
    void RépartirPassager(int nb);
}

//Une classe concrète implémentant cette interface :
class Marin : IVehicule
{
    public virtual void Demarrer() { }
    public virtual void RépartirPassager(int nb) { }
    public virtual void PériodicitéMaintenance() { } // avec une nouvelle méthode ajoutée.
}

abstract class Terrestre : IVehicule
{
    private int nbr_passager = 0;
    private int periode_maintenance = 0;

    public abstract void Demarrer(); // méthode abstraite virtuelle
    public virtual void RépartirPassager(int nb)// méthode concrète virtuelle
    {
        nbr_passager = nb;
        Console.WriteLine("Nombres de passagers = " + nb);
    }
    public virtual void PériodicitéMaintenance() { }
}

class Voiture : Terrestre
{
    public override void Demarrer() // redéfinition de méthode abstraite virtuelle
    {
        //...on explique comment démarrer une voiture
    }
    public override void RépartirPassager(int nb)// redéfinition de méthode concrète virtuelle
    {
        base.RépartirPassager(nb + 2); // appel à la méthode mère de classe Terrestre
    }
}

class Exercice
{
    public static void Main(string[] args) // méthode principale de lancement de l'exécution
    {

        //IVehicule subaru = new Voiture();
        Voiture subaru = new Voiture();
        subaru.RépartirPassager(3);
        Console.ReadLine();
    }
}